#ifndef __BSP_AS5600_H
#define __BSP_AS5600_H

#include "i2c.h"
#include <stdbool.h>


#define AS5600_I2C_HANDLE hi2c1

#define I2C_TIME_OUT_BASE   10
#define I2C_TIME_OUT_BYTE   1

/*
注意:AS5600的地址0x36是指的是原始7位设备地址,而ST I2C库中的设备地址是指原始设备地址左移一位得到的设备地址
*/

#define AS5600_RAW_ADDR    0x36
#define AS5600_ADDR        (AS5600_RAW_ADDR << 1)
#define AS5600_WRITE_ADDR  (AS5600_RAW_ADDR << 1)
#define AS5600_READ_ADDR   ((AS5600_RAW_ADDR << 1) | 1)


#define AS5600_RESOLUTION 4096 //12bit Resolution 
#define AS5600_RAW_ANGLE_REGISTER  0x0C


typedef struct {
			int32_t angle;        //角度范围0-65535对应0-2pi
			int32_t old_angle;
	    
	//可以10次或者20次FOC环路计算采一次角度数据，这样能适应更低速度计算，且不怎么影响速度准确性
	//至于位置控制一般是低速，偏差不大，高速时可能会有一些角度误差，因此增加采角度数据频率
	    uint16_t      Speed_count;      //速度计数值，两次请求编码器角度数据之间进入FOC环路计算中断次数
//			uint16_t      LPF_k1_count;     
//			uint16_t      LPF_k2_count;    
//	    uint16_t      Speed_countFitter; //速度计数滤波值
//      uint16_t      Speed_count_old;   //速度计数历史值
			uint32_t      speed_coeff;       //速度系数,通过Speed_count、极对数、中断频率算出，
	                                     //结合Speed_ele_angleIQFitter计算实际转速Speed_RPM
	
	    int32_t       Speed_angleIQ; //速度角度值（计算速度），即两次角度之差
			uint16_t      LPF_k1_RPM;    // 一阶低通滤波系数 K1: 0.016/(T+0.016);  放大了1024倍，从浮点数转为了Q10格式定点数，截止频率10hz
			uint16_t      LPF_k2_RPM;     // 一阶低通滤波系数 K2: T/(T+0.016);	
      int32_t       Speed_angleIQFitter; //速度角度滤波值
	    uint16_t      Speed_RPM;         //电机旋转速度 
	
	    
	    uint8_t       Move_State;        //电机旋转状态
	    uint8_t       Sample_Mode;        //采样模式，分为速度采样和位置采样、
			uint32_t      full_rotation_offset;   //转过的整圈数
}Encoder_AS5600_t;
extern   Encoder_AS5600_t   Encoder_AS5600;
				 
		 
#define  AS5600_DEFAULTS {0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,  2,0,0,0,0,0} // 初始化参数

void bsp_as5600Init(void);
uint16_t bsp_as5600GetRawAngle(void);
float bsp_as5600GetAngle(void);

#endif /* __BSP_AS5600_H */





